##
## Copyright (c) 2008 Phil Hassey
## 
## ================================================================================
## 
## tinypy contains tinypy code licensed in a MIT format license.  It also
## contains some goodies grabbed from Python, so that license is included
## as well.
## 
## ================================================================================
## 
## The tinypy License
## 
## Copyright (c) 2008 Phil Hassey
## 
## Permission is hereby granted, free of charge, to any person obtaining a copy
## of this software and associated documentation files (the "Software"), to deal
## in the Software without restriction, including without limitation the rights
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
## copies of the Software, and to permit persons to whom the Software is
## furnished to do so, subject to the following conditions:
## 
## The above copyright notice and this permission notice shall be included in
## all copies or substantial portions of the Software.
## 
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
## THE SOFTWARE.
## 
## ================================================================================
## 
## PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
## --------------------------------------------
## 
## 1. This LICENSE AGREEMENT is between the Python Software Foundation
## ("PSF"), and the Individual or Organization ("Licensee") accessing and
## otherwise using this software ("Python") in source or binary form and
## its associated documentation.
## 
## 2. Subject to the terms and conditions of this License Agreement, PSF
## hereby grants Licensee a nonexclusive, royalty-free, world-wide
## license to reproduce, analyze, test, perform and/or display publicly,
## prepare derivative works, distribute, and otherwise use Python
## alone or in any derivative version, provided, however, that PSF's
## License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
## 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation; 
## All Rights Reserved" are retained in Python alone or in any derivative 
## version prepared by Licensee.
## 
## 3. In the event Licensee prepares a derivative work that is based on
## or incorporates Python or any part thereof, and wants to make
## the derivative work available to others as provided herein, then
## Licensee hereby agrees to include in any such work a brief summary of
## the changes made to Python.
## 
## 4. PSF is making Python available to Licensee on an "AS IS"
## basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
## IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
## DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
## FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
## INFRINGE ANY THIRD PARTY RIGHTS.
## 
## 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
## FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
## A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
## OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
## 
## 6. This License Agreement will automatically terminate upon a material
## breach of its terms and conditions.
## 
## 7. Nothing in this License Agreement shall be deemed to create any
## relationship of agency, partnership, or joint venture between PSF and
## Licensee.  This License Agreement does not grant permission to use PSF
## trademarks or trade name in a trademark sense to endorse or promote
## products or services of Licensee, or any third party.
## 
## 8. By copying, installing or otherwise using Python, Licensee
## agrees to be bound by the terms and conditions of this License
## Agreement.
## 
## ================================================================================
##

import sys
if not "tinypy" in sys.version:
    from boot import *

import tokenize,parse,encode

def _compile(s,fname):
    tokens = tokenize.tokenize(s)
    t = parse.parse(s,tokens)
    r = encode.encode(fname,s,t)
    return r

def _import(name):
    if name in MODULES:
        return MODULES[name]
    py = name+".py"
    tpc = name+".tpc"
    if exists(py):
        if not exists(tpc) or mtime(py) > mtime(tpc):
            s = load(py)
            code = _compile(s,py)
            save(tpc,code)
    if not exists(tpc): raise
    code = load(tpc)
    g = {'__name__':name,'__code__':code}
    g['__dict__'] = g
    MODULES[name] = g
    exec(code,g)
    return g
    
    
def _init():
    BUILTINS['compile'] = _compile
    BUILTINS['import'] = _import

def import_fname(fname,name):
    g = {}
    g['__name__'] = name
    MODULES[name] = g
    s = load(fname)
    code = _compile(s,fname)
    g['__code__'] = code
    exec(code,g)
    return g

def tinypy():
    return import_fname(ARGV[0],'__main__')

def main(src,dest):
    s = load(src)
    r = _compile(s,src)
    save(dest,r)

if __name__ == '__main__':
    main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
    #main(ARGV[1],ARGV[2])
